--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/__init__.py de7e0996ce218f5b697c33ff3d64f1451f4a1f0a (de7e0996) Text, 17.74 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787glob
Tff7b72import T7ee787time
Tff7b72import T7ee787datetime
Tff7b72import T7ee787random
Tff7b72import T7ee787threading
Tff7b72from T7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787.T7ee787Reticulum Tff7b72import Te6edf3Reticulum
Tff7b72from T7ee787.T7ee787Identity Tff7b72import Te6edf3Identity
Tff7b72from T7ee787.T7ee787Link Tff7b72import Te6edf3LinkTb4b4b4, Te6edf3RequestReceipt
Tff7b72from T7ee787.T7ee787Channel Tff7b72import Te6edf3MessageBase
Tff7b72from T7ee787.T7ee787Buffer Tff7b72import Te6edf3BufferTb4b4b4, Te6edf3RawChannelReaderTb4b4b4, Te6edf3RawChannelWriter
Tff7b72from T7ee787.T7ee787Transport Tff7b72import Te6edf3Transport
Tff7b72from T7ee787.T7ee787Discovery Tff7b72import Te6edf3InterfaceAnnouncer
Tff7b72from T7ee787.T7ee787Destination Tff7b72import Te6edf3Destination
Tff7b72from T7ee787.T7ee787Packet Tff7b72import Te6edf3Packet
Tff7b72from T7ee787.T7ee787Packet Tff7b72import Te6edf3PacketReceipt
Tff7b72from T7ee787.T7ee787Resolver Tff7b72import Te6edf3Resolver
Tff7b72from T7ee787.T7ee787Resource Tff7b72import Te6edf3ResourceTb4b4b4, Te6edf3ResourceAdvertisement
Tff7b72from T7ee787.T7ee787Cryptography Tff7b72import Te6edf3HKDF
Tff7b72from T7ee787.T7ee787Cryptography Tff7b72import Te6edf3Hashes
Te6edf3py_modules Tff7b72= Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/*.pyTa5d6ff"Tb4b4b4)
Te6edf3pyc_modules Tff7b72= Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/*.pycTa5d6ff"Tb4b4b4)
Te6edf3modules Tff7b72= Te6edf3py_modulesTff7b72+Te6edf3pyc_modules
Te6edf3__all__ Tff7b72= Tffa657listTb4b4b4(Tffa657setTb4b4b4(Tb4b4b4[Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3fTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff.pycTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff.pyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72for Te6edf3f Tff7b72in Te6edf3modules Tff7b72if Tff7b72not Tb4b4b4(Te6edf3fTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff__init__.pyTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3fTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff__init__.pycTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff"Ta5d6ffcythonTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72import T7ee787cythonTb4b4b4; Te6edf3compiled Tff7b72= Te6edf3cythonTff7b72.Td2a8ffcompiled
Tff7b72elseTb4b4b4: Te6edf3compiled Tff7b72= Tff7b72False
Te6edf3LOG_NONE Tff7b72= Tff7b72-T79c0ff1
Te6edf3LOG_CRITICAL Tff7b72= T79c0ff0
Te6edf3LOG_ERROR Tff7b72= T79c0ff1
Te6edf3LOG_WARNING Tff7b72= T79c0ff2
Te6edf3LOG_NOTICE Tff7b72= T79c0ff3
Te6edf3LOG_INFO Tff7b72= T79c0ff4
Te6edf3LOG_VERBOSE Tff7b72= T79c0ff5
Te6edf3LOG_DEBUG Tff7b72= T79c0ff6
Te6edf3LOG_EXTREME Tff7b72= T79c0ff7
Te6edf3LOG_STDOUT Tff7b72= T79c0ff0x91
Te6edf3LOG_FILE Tff7b72= T79c0ff0x92
Te6edf3LOG_CALLBACK Tff7b72= T79c0ff0x93
Te6edf3LOG_MAXSIZE Tff7b72= T79c0ff5Tff7b72*T79c0ff1024Tff7b72*T79c0ff1024
Te6edf3loglevel Tff7b72= Te6edf3LOG_NOTICE
Te6edf3logfile Tff7b72= Tff7b72None
Te6edf3logdest Tff7b72= Te6edf3LOG_STDOUT
Te6edf3logcall Tff7b72= Tff7b72None
Te6edf3logtimefmt Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"
Te6edf3logtimefmt_p Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffS.Tffd700%fTa5d6ff"
Te6edf3compact_log_fmt Tff7b72= Tff7b72False
Te6edf3instance_random Tff7b72= Te6edf3randomTff7b72.Td2a8ffRandomTb4b4b4(Tb4b4b4)
Te6edf3instance_randomTff7b72.Td2a8ffseedTb4b4b4(Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4)
Te6edf3_always_override_destination Tff7b72= Tff7b72False
Te6edf3logging_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffloglevelnameTb4b4b4(Te6edf3levelTb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_CRITICALTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Critical]Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_ERRORTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Error] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_WARNINGTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Warning] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_NOTICETb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Notice] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_INFOTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Info] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_VERBOSETb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Verbose] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_DEBUGTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Debug] Ta5d6ff"
Tff7b72if Tb4b4b4(Te6edf3level Tff7b72== Te6edf3LOG_EXTREMETb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[Extra] Ta5d6ff"
Tff7b72return Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Tff7b72def Td2a8ffversionTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3__version__
Tff7b72def Td2a8ffhost_osTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72from T7ee787.T7ee787vendorT7ee787.T7ee787platformutils Tff7b72import Te6edf3get_platform
Tff7b72return Te6edf3get_platformTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftimestamp_strTb4b4b4(Te6edf3time_sTb4b4b4)Tb4b4b4:
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3time_sTb4b4b4)
Tff7b72return Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Te6edf3logtimefmtTb4b4b4, Te6edf3timestampTb4b4b4)
Tff7b72def Td2a8ffprecise_timestamp_strTb4b4b4(Te6edf3time_sTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3datetimeTff7b72.Td2a8ffdatetimeTff7b72.Td2a8ffnowTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstrftimeTb4b4b4(Te6edf3logtimefmt_pTb4b4b4)Tb4b4b4[Tb4b4b4:Tff7b72-T79c0ff3Tb4b4b4]
Tff7b72def Td2a8fflogTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3levelTff7b72=T79c0ff3Tb4b4b4, Te6edf3_override_destination Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3ptTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3loglevel Tff7b72== Te6edf3LOG_NONETb4b4b4: Tff7b72return
Tff7b72global Te6edf3_always_override_destinationTb4b4b4, Te6edf3compact_log_fmt
Te6edf3msg Tff7b72= Tffa657strTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72if Te6edf3loglevel Tff7b72>Tff7b72= Te6edf3levelTb4b4b4:
Tff7b72if Te6edf3ptTb4b4b4:
Te6edf3logstring Tff7b72= Ta5d6ff"Ta5d6ff[Ta5d6ff"Tff7b72+Te6edf3precise_timestamp_strTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff] Ta5d6ff"Tff7b72+Te6edf3loglevelnameTb4b4b4(Te6edf3levelTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3msg
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3compact_log_fmtTb4b4b4:
Te6edf3logstring Tff7b72= Ta5d6ff"Ta5d6ff[Ta5d6ff"Tff7b72+Te6edf3timestamp_strTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff] Ta5d6ff"Tff7b72+Te6edf3loglevelnameTb4b4b4(Te6edf3levelTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3msg
Tff7b72elseTb4b4b4:
Te6edf3logstring Tff7b72= Ta5d6ff"Ta5d6ff[Ta5d6ff"Tff7b72+Te6edf3timestamp_strTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff] Ta5d6ff"Tff7b72+Te6edf3msg
Tff7b72with Te6edf3logging_lockTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3logdest Tff7b72== Te6edf3LOG_STDOUT Tff7b72or Te6edf3_always_override_destination Tff7b72or Te6edf3_override_destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3threadingTff7b72.Td2a8ffmain_threadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffis_aliveTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Tffa657printTb4b4b4(Te6edf3logstringTb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72pass
Tff7b72elif Tb4b4b4(Te6edf3logdest Tff7b72== Te6edf3LOG_FILE Tff7b72and Te6edf3logfile Tff7b72!= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3logfileTb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4: Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3logstringTff7b72+Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3logfileTb4b4b4) Tff7b72> Te6edf3LOG_MAXSIZETb4b4b4:
Te6edf3prevfile Tff7b72= Te6edf3logfileTff7b72+Ta5d6ff"Ta5d6ff.1Ta5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3prevfileTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3prevfileTb4b4b4)
Te6edf3osTff7b72.Td2a8ffrenameTb4b4b4(Te6edf3logfileTb4b4b4, Te6edf3prevfileTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3_always_override_destination Tff7b72= Tff7b72True
Te6edf3logTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while writing log message to log file: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3LOG_CRITICALTb4b4b4)
Te6edf3logTb4b4b4(Ta5d6ff"Ta5d6ffDumping future log events to console!Ta5d6ff"Tb4b4b4, Te6edf3LOG_CRITICALTb4b4b4)
Te6edf3logTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3levelTb4b4b4)
Tff7b72elif Te6edf3logdest Tff7b72== Te6edf3LOG_CALLBACKTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3logcallTb4b4b4(Te6edf3logstringTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3_always_override_destination Tff7b72= Tff7b72True
Te6edf3logTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while calling external log handler: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3LOG_CRITICALTb4b4b4)
Te6edf3logTb4b4b4(Ta5d6ff"Ta5d6ffDumping future log events to console!Ta5d6ff"Tb4b4b4, Te6edf3LOG_CRITICALTb4b4b4)
Te6edf3logTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3levelTb4b4b4)
Tff7b72def Td2a8ffrandTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3instance_randomTff7b72.Td2a8ffrandomTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3result
Tff7b72def Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787traceback
Te6edf3exception_info Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3tracebackTff7b72.Td2a8ffTracebackExceptionTff7b72.Td2a8fffrom_exceptionTb4b4b4(Te6edf3eTb4b4b4)Tff7b72.Td2a8ffformatTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3logTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn unhandled Tffd700{Tffa657strTb4b4b4(Tffa657typeTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff exception occurred: Tffd700{Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3LOG_ERRORTb4b4b4)
Te6edf3logTb4b4b4(Te6edf3exception_infoTb4b4b4, Te6edf3LOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffhexrepTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3delimitTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tffa657iterTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149TypeErrorTb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4[Te6edf3dataTb4b4b4]
Te6edf3delimiter Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3delimitTb4b4b4:
Te6edf3delimiter Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3hexrep Tff7b72= Te6edf3delimiterTff7b72.Td2a8ffjoinTb4b4b4(Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3cTb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3dataTb4b4b4)
Tff7b72return Te6edf3hexrep
Tff7b72def Td2a8ffprettyhexrepTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3delimiter Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3hexrep Tff7b72= Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3delimiterTff7b72.Td2a8ffjoinTb4b4b4(Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3cTb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3dataTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72return Te6edf3hexrep
Tff7b72def Td2a8ffprettyspeedTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3prettysizeTb4b4b4(Te6edf3numTff7b72/T79c0ff8Tb4b4b4, Te6edf3suffixTff7b72=Te6edf3suffixTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"
Tff7b72def Td2a8ffprettysizeTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'
Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'
Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0
Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72def Td2a8ffprettyfrequencyTb4b4b4(Te6edf3hzTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ffHzTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3hz Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff0 HzTa5d6ff"
Te6edf3num Tff7b72= Te6edf3hzTff7b72*T79c0ff1e6
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffµTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffKTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffMTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffGTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffTTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffPTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffETa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffZTa5d6ff"Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff"Ta5d6ffYTa5d6ff"
Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0
Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72def Td2a8ffprettydistanceTb4b4b4(Te6edf3mTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3num Tff7b72= Te6edf3mTff7b72*T79c0ff1e6
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffµTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff"Ta5d6ffKTa5d6ff"
Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Te6edf3divisor Tff7b72= T79c0ff1000.0
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4: Te6edf3divisor Tff7b72= T79c0ff10
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4: Te6edf3divisor Tff7b72= T79c0ff100
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< Te6edf3divisorTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= Te6edf3divisor
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72def Td2a8ffprettytimeTb4b4b4(Te6edf3timeTb4b4b4, Te6edf3verboseTff7b72=Tff7b72FalseTb4b4b4, Te6edf3compactTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3neg Tff7b72= Tff7b72False
Tff7b72if Te6edf3time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3time Tff7b72= Tffa657absTb4b4b4(Te6edf3timeTb4b4b4)
Te6edf3neg Tff7b72= Tff7b72True
Te6edf3days Tff7b72= Tffa657intTb4b4b4(Te6edf3time Tff7b72/Tff7b72/ Tb4b4b4(T79c0ff24 Tff7b72* T79c0ff3600Tb4b4b4)Tb4b4b4)
Te6edf3time Tff7b72= Te6edf3time Tff7b72% Tb4b4b4(T79c0ff24 Tff7b72* T79c0ff3600Tb4b4b4)
Te6edf3hours Tff7b72= Tffa657intTb4b4b4(Te6edf3time Tff7b72/Tff7b72/ T79c0ff3600Tb4b4b4)
Te6edf3time Tff7b72%Tff7b72= T79c0ff3600
Te6edf3minutes Tff7b72= Tffa657intTb4b4b4(Te6edf3time Tff7b72/Tff7b72/ T79c0ff60Tb4b4b4)
Te6edf3time Tff7b72%Tff7b72= T79c0ff60
Tff7b72if Te6edf3compactTb4b4b4:
Te6edf3seconds Tff7b72= Tffa657intTb4b4b4(Te6edf3timeTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3seconds Tff7b72= Tffa657roundTb4b4b4(Te6edf3timeTb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3ss Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3seconds Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3sm Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3minutes Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3sh Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3hours Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3sd Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3days Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3displayed Tff7b72= T79c0ff0
Te6edf3components Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3days Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3daysTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff dayTa5d6ff"Tff7b72+Te6edf3sd Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3daysTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3hours Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3hoursTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hourTa5d6ff"Tff7b72+Te6edf3sh Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3hoursTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3minutes Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3minutesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff minuteTa5d6ff"Tff7b72+Te6edf3sm Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3minutesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3seconds Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3secondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondTa5d6ff"Tff7b72+Te6edf3ss Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3secondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Te6edf3i Tff7b72= T79c0ff0
Te6edf3tstr Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3c Tff7b72in Te6edf3componentsTb4b4b4:
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72pass
Tff7b72elif Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4)Tb4b4b4:
Te6edf3tstr Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"
Tff7b72elif Te6edf3i Tff7b72== Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4)Tb4b4b4:
Te6edf3tstr Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff and Ta5d6ff"
Te6edf3tstr Tff7b72+Tff7b72= Te6edf3c
Tff7b72if Te6edf3tstr Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff0sTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3negTb4b4b4:
Tff7b72return Te6edf3tstr
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff-Tffd700{Te6edf3tstrTffd700}Ta5d6ff"
Tff7b72def Td2a8ffprettyshorttimeTb4b4b4(Te6edf3timeTb4b4b4, Te6edf3verboseTff7b72=Tff7b72FalseTb4b4b4, Te6edf3compactTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3neg Tff7b72= Tff7b72False
Te6edf3time Tff7b72= Te6edf3timeTff7b72*T79c0ff1e6
Tff7b72if Te6edf3time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3time Tff7b72= Tffa657absTb4b4b4(Te6edf3timeTb4b4b4)
Te6edf3neg Tff7b72= Tff7b72True
Te6edf3seconds Tff7b72= Tffa657intTb4b4b4(Te6edf3time Tff7b72/Tff7b72/ T79c0ff1e6Tb4b4b4)Tb4b4b4; Te6edf3time Tff7b72%Tff7b72= T79c0ff1e6
Te6edf3milliseconds Tff7b72= Tffa657intTb4b4b4(Te6edf3time Tff7b72/Tff7b72/ T79c0ff1e3Tb4b4b4)Tb4b4b4; Te6edf3time Tff7b72%Tff7b72= T79c0ff1e3
Tff7b72if Te6edf3compactTb4b4b4:
Te6edf3microseconds Tff7b72= Tffa657intTb4b4b4(Te6edf3timeTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3microseconds Tff7b72= Tffa657roundTb4b4b4(Te6edf3timeTb4b4b4, T79c0ff2Tb4b4b4)
Te6edf3ss Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3seconds Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3sms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3milliseconds Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3sus Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3microseconds Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3displayed Tff7b72= T79c0ff0
Te6edf3components Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3seconds Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3secondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondTa5d6ff"Tff7b72+Te6edf3ss Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3secondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffsTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3milliseconds Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3millisecondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff millisecondTa5d6ff"Tff7b72+Te6edf3sms Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3millisecondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffmsTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3microseconds Tff7b72> T79c0ff0 Tff7b72and Tb4b4b4(Tb4b4b4(Tff7b72not Te6edf3compactTb4b4b4) Tff7b72or Te6edf3displayed Tff7b72< T79c0ff2Tb4b4b4)Tb4b4b4:
Te6edf3componentsTff7b72.Td2a8ffappendTb4b4b4(Tffa657strTb4b4b4(Te6edf3microsecondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff microsecondTa5d6ff"Tff7b72+Te6edf3sus Tff7b72if Te6edf3verbose Tff7b72else Tffa657strTb4b4b4(Te6edf3microsecondsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffµsTa5d6ff"Tb4b4b4)
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Te6edf3i Tff7b72= T79c0ff0
Te6edf3tstr Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3c Tff7b72in Te6edf3componentsTb4b4b4:
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72pass
Tff7b72elif Te6edf3i Tff7b72< Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4)Tb4b4b4:
Te6edf3tstr Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"
Tff7b72elif Te6edf3i Tff7b72== Tffa657lenTb4b4b4(Te6edf3componentsTb4b4b4)Tb4b4b4:
Te6edf3tstr Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff and Ta5d6ff"
Te6edf3tstr Tff7b72+Tff7b72= Te6edf3c
Tff7b72if Te6edf3tstr Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff0usTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3negTb4b4b4:
Tff7b72return Te6edf3tstr
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff-Tffd700{Te6edf3tstrTffd700}Ta5d6ff"
Tff7b72def Td2a8ffphyparamsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRequired Physical Layer MTU : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffMTUTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPlaintext Packet MDU : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3PacketTff7b72.Td2a8ffPLAIN_MDUTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEncrypted Packet MDU : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3PacketTff7b72.Td2a8ffENCRYPTED_MDUTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink Curve : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3LinkTff7b72.Td2a8ffCURVETb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink Packet MDU : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3LinkTff7b72.Td2a8ffMDUTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink Public Key Size : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3LinkTff7b72.Td2a8ffECPUBSIZETff7b72*T79c0ff8Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bitsTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink Private Key Size : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3LinkTff7b72.Td2a8ffKEYSIZETff7b72*T79c0ff8Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bitsTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffpanicTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ff_exitTb4b4b4(T79c0ff255Tb4b4b4)
Te6edf3exit_called Tff7b72= Tff7b72False
Tff7b72def Td2a8ffexitTb4b4b4(Te6edf3codeTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3exit_called
Tff7b72if Tff7b72not Te6edf3exit_calledTb4b4b4:
Te6edf3exit_called Tff7b72= Tff7b72True
Te6edf3ReticulumTff7b72.Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ff_exitTb4b4b4(Te6edf3codeTb4b4b4)
Tff7b72class T56d364ProfilerTb4b4b4:
Te6edf3_ran Tff7b72= Tff7b72False
Te6edf3profilers Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3tags Tff7b72= Tb4b4b4{Tb4b4b4}
Tf0883e@staticmethod
Tff7b72def Td2a8ffget_profilerTb4b4b4(Te6edf3tagTff7b72=Tff7b72NoneTb4b4b4, Te6edf3super_tagTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3tag Tff7b72in Te6edf3ProfilerTff7b72.Td2a8ffprofilersTb4b4b4:
Tff7b72return Te6edf3ProfilerTff7b72.Td2a8ffprofilersTb4b4b4[Te6edf3tagTb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3profiler Tff7b72= Te6edf3ProfilerTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3super_tagTb4b4b4)
Te6edf3ProfilerTff7b72.Td2a8ffprofilersTb4b4b4[Te6edf3tagTb4b4b4] Tff7b72= Te6edf3profiler
Tff7b72return Te6edf3profiler
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3tagTff7b72=Tff7b72NoneTb4b4b4, Te6edf3super_tagTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpaused Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpause_time Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffpause_started Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftag Tff7b72= Te6edf3tag
Tff7b72selfTff7b72.Td2a8ffsuper_tag Tff7b72= Te6edf3super_tag
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsuper_tag Tff7b72in Te6edf3ProfilerTff7b72.Td2a8ffprofilersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsuper_profiler Tff7b72= Te6edf3ProfilerTff7b72.Td2a8ffprofilersTb4b4b4[Tff7b72selfTff7b72.Td2a8ffsuper_tagTb4b4b4]
Tff7b72selfTff7b72.Td2a8ffpause_super Tff7b72= Tff7b72selfTff7b72.Td2a8ffsuper_profilerTff7b72.Td2a8ffpause
Tff7b72selfTff7b72.Td2a8ffresume_super Tff7b72= Tff7b72selfTff7b72.Td2a8ffsuper_profilerTff7b72.Td2a8ffresume
Tff7b72elseTb4b4b4:
Tff7b72def Td2a8ffnoopTb4b4b4(Tff7b72selfTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ffsuper_profiler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpause_super Tff7b72= Te6edf3noop
Tff7b72selfTff7b72.Td2a8ffresume_super Tff7b72= Te6edf3noop
Tff7b72def Tff7b72__enter__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpause_superTb4b4b4(Tb4b4b4)
Te6edf3tag Tff7b72= Tff7b72selfTff7b72.Td2a8fftag
Te6edf3super_tag Tff7b72= Tff7b72selfTff7b72.Td2a8ffsuper_tag
Te6edf3thread_ident Tff7b72= Te6edf3threadingTff7b72.Td2a8ffget_identTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3tag Tff7b72in Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4:
Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4, Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4: Te6edf3super_tagTb4b4b4}
Tff7b72if Tff7b72not Te6edf3thread_ident Tff7b72in Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4] Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffcurrent_startTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffcapturesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}
Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcurrent_startTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8ffperf_counterTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffresume_superTb4b4b4(Tb4b4b4)
Tff7b72def Tff7b72__exit__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3tracebackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpause_superTb4b4b4(Tb4b4b4)
Te6edf3tag Tff7b72= Tff7b72selfTff7b72.Td2a8fftag
Te6edf3super_tag Tff7b72= Tff7b72selfTff7b72.Td2a8ffsuper_tag
Te6edf3end Tff7b72= Te6edf3timeTff7b72.Td2a8ffperf_counterTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffpause_time
Tff7b72selfTff7b72.Td2a8ffpause_time Tff7b72= T79c0ff0
Te6edf3thread_ident Tff7b72= Te6edf3threadingTff7b72.Td2a8ffget_identTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3tag Tff7b72in Te6edf3ProfilerTff7b72.Td2a8fftags Tff7b72and Te6edf3thread_ident Tff7b72in Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcurrent_startTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3begin Tff7b72= Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcurrent_startTa5d6ff"Tb4b4b4]
Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcurrent_startTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcapturesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3endTff7b72-Te6edf3beginTb4b4b4)
Tff7b72if Tff7b72not Te6edf3ProfilerTff7b72.Td2a8ff_ranTb4b4b4:
Te6edf3ProfilerTff7b72.Td2a8ff_ran Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffresume_superTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpauseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pause_startedTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpausedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpaused Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffpause_started Tff7b72= Te6edf3pause_started Tff7b72or Te6edf3timeTff7b72.Td2a8ffperf_counterTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpause_superTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpause_startedTb4b4b4)
Tff7b72def Td2a8ffresumeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpausedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpause_time Tff7b72+Tff7b72= Te6edf3timeTff7b72.Td2a8ffperf_counterTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffpause_started
Tff7b72selfTff7b72.Td2a8ffpaused Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffresume_superTb4b4b4(Tb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffranTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ProfilerTff7b72.Td2a8ff_ran
Tf0883e@staticmethod
Tff7b72def Td2a8ffresultsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72from T7ee787statistics Tff7b72import Te6edf3meanTb4b4b4, Te6edf3medianTb4b4b4, Te6edf3stdev
Te6edf3results Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3tag Tff7b72in Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4:
Te6edf3tag_captures Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3tag_entry Tff7b72= Te6edf3ProfilerTff7b72.Td2a8fftagsTb4b4b4[Te6edf3tagTb4b4b4]
Tff7b72for Te6edf3thread_ident Tff7b72in Te6edf3tag_entryTb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3thread_entry Tff7b72= Te6edf3tag_entryTb4b4b4[Ta5d6ff"Ta5d6ffthreadsTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3thread_identTb4b4b4]
Te6edf3thread_captures Tff7b72= Te6edf3thread_entryTb4b4b4[Ta5d6ff"Ta5d6ffcapturesTa5d6ff"Tb4b4b4]
Te6edf3sample_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3thread_capturesTb4b4b4)
Tff7b72if Te6edf3sample_count Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3thread_results Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3sample_countTb4b4b4,
Ta5d6ff"Ta5d6ffmeanTa5d6ff"Tb4b4b4: Te6edf3meanTb4b4b4(Te6edf3thread_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmedianTa5d6ff"Tb4b4b4: Te6edf3medianTb4b4b4(Te6edf3thread_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstdevTa5d6ff"Tb4b4b4: Te6edf3stdevTb4b4b4(Te6edf3thread_capturesTb4b4b4)
Tb4b4b4}
Tff7b72elif Te6edf3sample_count Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3thread_results Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3sample_countTb4b4b4,
Ta5d6ff"Ta5d6ffmeanTa5d6ff"Tb4b4b4: Te6edf3meanTb4b4b4(Te6edf3thread_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmedianTa5d6ff"Tb4b4b4: Te6edf3medianTb4b4b4(Te6edf3thread_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstdevTa5d6ff"Tb4b4b4: Tff7b72None
Tb4b4b4}
Te6edf3tag_capturesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3thread_capturesTb4b4b4)
Te6edf3sample_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3tag_capturesTb4b4b4)
Tff7b72if Te6edf3sample_count Tff7b72> T79c0ff1Tb4b4b4:
Te6edf3tag_results Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3tagTb4b4b4,
Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4: Te6edf3tag_entryTb4b4b4[Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmeanTa5d6ff"Tb4b4b4: Te6edf3meanTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmedianTa5d6ff"Tb4b4b4: Te6edf3medianTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstdevTa5d6ff"Tb4b4b4: Te6edf3stdevTb4b4b4(Te6edf3tag_capturesTb4b4b4)
Tb4b4b4}
Tff7b72elif Te6edf3sample_count Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3tag_results Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3tagTb4b4b4,
Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4: Te6edf3tag_entryTb4b4b4[Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Tffa657lenTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmeanTa5d6ff"Tb4b4b4: Te6edf3meanTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmedianTa5d6ff"Tb4b4b4: Te6edf3medianTb4b4b4(Te6edf3tag_capturesTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffstdevTa5d6ff"Tb4b4b4: Tff7b72None
Tb4b4b4}
Te6edf3resultsTb4b4b4[Te6edf3tagTb4b4b4] Tff7b72= Te6edf3tag_results
Tff7b72def Td2a8ffprint_results_recursiveTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3resultsTb4b4b4, Te6edf3levelTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3print_tag_resultsTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3levelTff7b72+T79c0ff1Tb4b4b4)
Tff7b72for Te6edf3tag_name Tff7b72in Te6edf3resultsTb4b4b4:
Te6edf3sub_tag Tff7b72= Te6edf3resultsTb4b4b4[Te6edf3tag_nameTb4b4b4]
Tff7b72if Te6edf3sub_tagTb4b4b4[Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3print_results_recursiveTb4b4b4(Te6edf3sub_tagTb4b4b4, Te6edf3resultsTb4b4b4, Te6edf3levelTff7b72=Te6edf3levelTff7b72+T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffprint_tag_resultsTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3levelTb4b4b4)Tb4b4b4:
Te6edf3ind Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Te6edf3level
Te6edf3name Tff7b72= Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3count Tff7b72= Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4]
Te6edf3mean Tff7b72= Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffmeanTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3median Tff7b72= Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffmedianTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3stdev Tff7b72= Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffstdevTa5d6ff"Tb4b4b4]
Tffa657printTb4b4b4( Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4( Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Ta5d6ff Samples : Tffd700{Te6edf3countTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3stdev Tff7b72!= Tff7b72NoneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Ta5d6ff Mean : Tffd700{Te6edf3prettyshorttimeTb4b4b4(Te6edf3meanTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Ta5d6ff Median : Tffd700{Te6edf3prettyshorttimeTb4b4b4(Te6edf3medianTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Ta5d6ff St.dev. : Tffd700{Te6edf3prettyshorttimeTb4b4b4(Te6edf3stdevTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4( Ta5d6fffTa5d6ff"Tffd700{Te6edf3indTffd700}Ta5d6ff Total : Tffd700{Te6edf3prettyshorttimeTb4b4b4(Te6edf3meanTff7b72*Te6edf3countTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffProfiler results:Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3tag_name Tff7b72in Te6edf3resultsTb4b4b4:
Te6edf3tag Tff7b72= Te6edf3resultsTb4b4b4[Te6edf3tag_nameTb4b4b4]
Tff7b72if Te6edf3tagTb4b4b4[Ta5d6ff"Ta5d6ffsuperTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3print_results_recursiveTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3resultsTb4b4b4)
Te6edf3profile Tff7b72= Te6edf3ProfilerTff7b72.Td2a8ffget_profiler
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────